Python
gao17
2019-10-27
Python Python 基础 内存 变量类型 占位符 转移符 IO 字典 super和_init_搭配使用 继承:和Java的一致 合成 列表 元祖 字符串 布尔值与空值 elif while else与for in turtle 知识点导图 函数 set 迭代器 关键字参数 默认参数 不定长参数 匿名函数 装饰器 偏函数 变量的作用域 异常处理 断言 文件读写 os模块 窗口控制 语音合成 递归 栈队列 时间模块 模块 自定义模块 导入模块部分内容 不执行模块中部分内容 第三方模块 面向对象 构造函数 析构函数 单继承 多继承 多态 对象属性和类属性 动态添加属性方法 @property tkinter label button entry text text(滚动条) checkButton radioButton lstbox Scal spinBox Menu顶层菜单 Menu右键菜单 comcobox Frame 表格 布局 绝对布局 相对布局 表格布局 事件 按键事件 响应特殊事件 自动化 读写csv文件 读写pif文件 word自动化 excel自动化 ppt自动化 播放音乐 修改背景图片 键盘模拟 鼠标模拟 p2和p3区别 远程控制 排列 组合 排列组合 正则表达式 元字符 字符串切割 爬虫 模拟浏览器 破解拦截同一个请求头多次请求 设置超时 HTTP请求 json格式数据 抓取ajax请求的数据 糗事百科爬虫 QQ号爬取 网络编程 客户端 服务端 tcp编程 udp编程 模拟飞秋 客户端 服务端 多进程 多任务简介 多任务实现 进程 单任务现象 全局变量不能共享 进程池 进程间通信 多线程 启动多线程 线程间数据共享 线程锁解决多线程数据混乱 多任务 ThreadLocal解决多线程数据混乱 信号量控制线程数量 筹够数量执行 延迟线程 线程通信(阻塞事件触发) 生产者和消费者 线程调度 协程 数据传输 数据库 MongoDB Redis 数据库 文档 集合 操作数据库 Python操作代码 服务命令 Redis数据类型命令 Python操作代码 Tips 查看是否安装某模块 元祖中可以存放不同类型的数据,因此使用join转字符串时需注意: 在join方法前将元祖中数据类型统一变为str>>>>>>>>>>>>>>>>>> str="".join([str(i) for i in duple]) Django 虚拟环境 意义 virtualenv virtualenvwrapper 框架 安装命令 创建虚拟环境 进入(激活)虚拟环境 pip查看安装模块 安装依赖包 退出虚拟环境 创建虚拟环境指定Python版本 安装virtualenvwrapper 创建虚拟环境 切换到某个虚拟环境 退出当前虚拟环境 删除某个虚拟环境 列出所有虚拟环境 进入到虚拟化境所在的目录 修改创建环境默认在用户目录下 创建虚拟环境指定Python版本 安装Django2.1 创建项目 1.通过命令行的方式 2.通过pycharm的方式 tips 修改pip安装源 改变端口号 1.在终端 2.在pycharm中 同局域网中的其他电脑访问本机的项目 1、在终端 2、在pycharm 最后修改`settings.py`文件 项目结构分析 1.manange.py 2.settings.py 3.urls.py 4.wsig.py django推荐的项目规范 DEBUG模式 1、学前准备 2、URL与视图 URL分发器> Web.xml URL映射 URL中添加参数> Model 运行项目 1.通过命令行的方式 默认首页>index.jsp URL中包含另外一个urls模块 path函数> ModelAndVeiw 3、模板> jsp 渲染模板 模板查找路径配置 DTL模板变量> 标签> jstl if 标签 for...in... 标签 for...in...empty with 标签 url 标签> jsp中URL跳转的Collection spaceless 标签 autoescape 标签 verbatim 标签 更多标签请参考官方文档: https://docs.djangoproject.com/en/2.0/ref/ templates/builtins/ 模板过滤器> 模板变量方法 add cut date default default_if_none first last floatformat join length lower upper random safe slice stringtags truncatechars truncatechars_html 模版结构优化 1.引入模版 2.模板继承 加载静态文件 MySQL MySQL驱动 操作数据库 1.Django配置连接数据库 2.Django中操作数据库 3.Tips 1.ORM模型介绍 2.创建orm模型 3.映射模型到数据库中 ORM模型 4.模型常用属性 5.外键和表关系 一对一 多对多 related_name和related_query_name: 一对多 6.模型的操作 1.添加一个模型到数据库中 2.查找数据 3.查找所有数据 4.数据过滤 5.获取单个对象 6.数据排序 7.修改数据 8.删除数据 9.查询操作 1.exact 2.iexact 3.contains 4.icontains 5.in 6.gt 7.gte 8.lt 9.lte 10.startswith 11.istartswith 12.endswith 13.iendswith 14.range 15.date 16.year 17.month 18.day 19.week_day 20.time 21.isnull 22.regex和iregex 7.聚合函数 1.Avg 2.Count 3.Max 和 Min 4.Sum 5.更多的聚合函数请参考官方文档: https://docs.djangoproject.com/en/2.0/ref/ models/querysets/#aggregation-functions 6.aggregate和annotate的区别 8.F表达式和Q表达式 9.QuerySet API 表单 表单概述 用表单验证数据 常用验证器 ModelForm 7.分组 小结 自己字段则直接使用属性即可,如果是其关联外键的object则使用类名.属性获取 html中options使用超连接 小饭桌系统开发 项目介绍 前端 后端 nvm:管理node.js的工具 node.js:自带有npm包管理工具,为了使用其nvm npm:类似于Python的pip gulp:用来自动化开发流程:比如asaa转css,css和js压缩 Python3.6 Django2.0 MySQL Nvm命令 nvm install node:安装最新的node nvm install [version]:安装指定版本的node nvm use[version]:shiyong mouge banbende node nvm list nvm uninstall [version] nvm node_mirror [url]:设置nvm的景象 nvm npm_mirror [url]:设置npm的景象 安装教程(nvm-node-npm-gulp) npm命令 npm install -g cnpm --registry=https://registry.npm.tao bao.org 安装 cnpm 以后可通过cnpm来代替npm npm install xx :本地安装 当前项目可以使用 ==》将安装包放./node_modeules 下运行npm命令时所在的目录如果没有node_modules目录,则会在当前目录生成node ——modules 不能通过命令来使用,只能通过require()引入 npm install xx -g 全局安装 所有项目都可使用, 通过命令来使用 通过require()引入本地安装的包==》将安装包放在/usr/local下或者你node的安装 目录 npm uninstall [package] 卸载包 npm update 【package】 更新包 npm search [package] 搜索包 安装gulp 全区安装 -要安装:npm gulp -g 本地安装 -要安装:npm gulp --save-dev npm init 创建 pom文件 gulp创建任务 创建gulpfile.js在本地项目根目录中 执行任务 创建处理css文件的任务 1.安装gulp-cssnano插件 2.创建js文件执行任务 3.执行任务 css文件重命名 1.安装gulp-rename --save-dev 3.更多教程:https://www.npmjs.com/package/gulp-rename >>>生成node_modules文件 Lib 2.创建js文件执行任务 Gulp gulp详解 安装准备 Task Private tasks:被设计为在内部使用,通常作为 series() 或 parallel() 组合的 组成部分。 Public tasks:将Private tasks导出,可以供gulp命令执行 组合task series:序列(顺序执行) parallel:并行(同时执行) 混用:任务间有依赖 输入输出 golb详解 监听文件 gulpfile split 返回值 stream promise event emitter child process observable callback 使用 async/await 创建任务 可监控的事件 初次执行 队列 延迟 API src:读取文件 dest:写入文件 symlink:连接 Vinyl 对象到文件系统 lastRun:当前运行进程中成功完成任务的最后一次时间 series:顺序依次执行 parallel:并发执行 watch:监听 task:不推荐,使用function替代 registry:自定义的注册表插入到任务系统 tree:获取当前任务依赖关系树 vinyl:虚拟的文件格式 vinyl.isVinyl Vinyl.isCustomProp Tornado Flask npm list --depth=0 查看 __name__属性当当前文件执行时则等于__main__。如果当前文件被引入的时候则等于 模块名 tornado基础 第一个tornado程序 import tornado.web ''' tornado的基础web框架模块 ''' import tornado.ioloop ''' tornado的核心IO循环模块,封装了Linux的epoll和BSD的kqueue,是tornado高效的基础 ''' # 类比Django中的视图 # 一个业务处理类 class IndexHandler(tornado.web.RequestHandler): # 处理get请求的,不能处理post请求 def get( self , *args, **kwargs): # 对应http请求的方法 # 给浏览器响应信息 self .write( "sunck is a good man" ) if __name__ == "__main__" : # 实例化一个app对象 # Application:是tornado web框架的核心应用类,是与服务器对应的接口 # 里面保存了路由映射表,有一个listen方法用来创建一个http服务器的实例,并绑定了端口 app = tornado.web.Application([ ( r"/" , IndexHandler) ]) # 绑定监听端口 # 注意:此时服务器并没有开启监听 app.listen( 8000 ) ''' IOLoop.current():返回当前线程的IOLoop实例 IOLoop.start():启动IOLoop实例的I/O循环,同时开启了监听 ''' tornado.ioloop.IOLoop.current().start() 高性能原理 以Linux的epoll为例 httpserver httpserver对象 import tornado.web import tornado.ioloop # 引入httpserver模块 import tornado.httpserver class IndexHandler(tornado.web.RequestHandler): def get( self , *args, **kwargs): self .write( "sunck is a good man" ) if __name__ == "__main__" : app = tornado.web.Application([ ( r"/" , IndexHandler) ]) # app.listen(8000)只能在单进程中使用 #实例化一个http服务器对象 httpServer = tornado.httpserver.HTTPServer(app) # 绑定端口 httpServer.listen( 8000 ) tornado.ioloop.IOLoop.current().start() 单进程与多进程 注意 tornado服务默认启动的是单进程 开启多个进程 代码示例 import tornado.web import tornado.ioloop import tornado.httpserver class IndexHandler(tornado.web.RequestHandler): def get(self, *args, **kwargs): self.write( "sunck is a good man" ) if __name__ == "__main__" : app = tornado.web.Application([ ( r"/" , IndexHandler) ]) httpServer = tornado.httpserver.HTTPServer(app) # httpServer.listen(8000) httpServer.bind(8000) httpServer.start(5) tornado.ioloop.IOLoop.current().start() 说明 httpServer.bind(port) 将服务器绑定到指定的端口 httpServer.start(num) 默认开启1个进程 值大于0,创建对应个数个子进程 值为None或者小于等于0,开启对应硬件机器的cup核心数个子进程 补充说明 app.listen() 只能在单进程模式中使用 多进程 虽然tornado给我们提供了一次性启动多个进程的方式,但是由于一些问题,不建议使用上面 方式启动多进程, 而是手动启动多个进程,绑定不同的端口即可解决 问题 每个 子进程都会从父进程中复制一份IOLoop的实例 ,如果在创建子进程前修改了IOLoop,会 影响所有的子进程 所有的进程都是由一个命令启动的,无法做到在不停止服务的情况下修改代码 所有进程共享一个端口,想要分别监控很困难 options:动态端口号 tornado为我们提供了一个tornado.options模块 作用 全局参数的定义、存储、转换 基础方法与属性 tornado.options.define() 原型 tornado.options.define(name, default = None , type = No ne , help = None , metavar = None , multiple = False , group = N one , callback = None ) 功能 用来定义options选项变量的方法 参数 name 选项变量名,必须保证其唯一性,否则会报"Option 'xxx' already define in ..." default 设置选项变量的默认值,默认为None type 设置选项变量的类型,从命令行或配置文件导入参数时tornado会根据类型转换输入的值,转 换不成会报错。可以str,float,int,datetime,timedelta 如果没有设置type,会根据default的值进行转换 如果default没有设置,那么不进行转换 multiple 设置选项变量是否可以为多个值,默认为False help 选项变量的帮助提示信息 示例 tornado.options.define( "port" , default = 8000 , type = i nt ) tornado.options.define( "list" , default =[], type = str ) tornado.options.options 全局的options对象,所有定义的选项变量都会作为该对象的属性 获取命令行参数的方法 tornado.options.parse_command_line():不推荐使用 作用 转换命令行参数, 示例 import tornado.web import tornado.ioloop import tornado.httpserver import tornado.options #定义两个参数 tornado.options.define( "port" , default = 8000 , type = int ) tornado.options.define( "list" , default =[], type = str , multiple = True ) class IndexHandler(tornado.web.RequestHandler): def get( self , *args, **kwargs): self .write( "sunck is a good man" ) if __name__ == "__main__" : # 转换命令行参数,并保存到tornado.options.optrons tornado.options.parse_command_line() print ( "list = " , tornado.options.options.list) app = tornado.web.Application([ ( r"/" , IndexHandler) ]) httpServer = tornado.httpserver.HTTPServer(app) # 使用变量的值 httpServer.bind(tornado.options.options.port) httpServer.start( 1 ) tornado.ioloop.IOLoop.current().start() 启动 python server04.py --port =9000 --list =good,nice,handsome,cool tornado.options.parse_config_file(path) 作用 从配置文件导入参数 代码示例 import tornado.web import tornado.ioloop import tornado.httpserver import tornado.options #定义两个参数 tornado.options.define( "port" , default = 8000 , type = int ) tornado.options.define( "list" , default =[], type = str , multiple = True ) class IndexHandler(tornado.web.RequestHandler): def get( self , *args, **kwargs): self .write( "sunck is a good man" ) if __name__ == "__main__" : tornado.options.parse_config_file( "config" ) print ( "list = " , tornado.options.options.list) app = tornado.web.Application([ ( r"/" , IndexHandler) ]) httpServer = tornado.httpserver.HTTPServer(app) httpServer.bind(tornado.options.options.port) httpServer.start( 1 ) tornado.ioloop.IOLoop.current().start() 需要创建一个名为config的普通文件 port = 7000 list = ["good","nice","handsome"] 说明 书写格式仍需要按照python的语法要求 不支持字典类型 最终版本 示例 import tornado.web import tornado.ioloop import tornado.httpserver import config class IndexHandler(tornado.web.RequestHandler): def get( self , *args, **kwargs): self .write( "sunck is a good man" ) if __name__ == "__main__" : print ( "list = " , config.options.list) app = tornado.web.Application([ ( r"/" , IndexHandler) ]) httpServer = tornado.httpserver.HTTPServer(app) httpServer.bind(config.options.port) httpServer.start( 1 ) tornado.ioloop.IOLoop.current().start() 需要创建一个名为config.py的普通文件 # 参数 options = { "port" : 8080 , "list" : [ "good" , "nice" , "handsome" ] } 日志 当饿哦们在代码中使用parse_command_line()或者parse_config_file(path)方法时,tornado会 默认开启logging模块功能,向屏幕终端输入一些打印信息 关闭日志 python server04.py --port=9087 --list=good,nice --logging=none 在第一行加入 tornado.options.options.logging = None tornado提升 整理基础工程 请看第一天的project工程目录 Application settings debug 作用 设置tornado是否工作在调试模式下,默认为False即工作在生产模式下。 True的特性 自动重启 tornado应用会监控源代码文件,当有保存改动时便会重新启动服务器,可以减少手动重启的 次数,提高开发效率。 如果保存后代码有错误会导致重启失败,修改错误后需要手动重启 可以通过autoreload = True单独设置debug四个特性中就自动重启生效 取消缓存编译的模板 可以通过compiled_template_cache = False单独设置 取消缓存静态文件的hash值 可以通过static_hash_cache = False单独设置 提供追踪信息 可以通过serve_traceback=True来单独设置 static_path 设置静态文件目录 template_path 设置模板文件目录 autoescape 当未None时关闭当前项目的自动转义,一般不建议使用 cookie_secret 配置安全cookie秘钥 xsrf_cookies 当为True开启XSRF保护 login_url 用户验证失败会映射该路由 示例 import os BASE_DIRS = os.path.dirname(__file__) #参数 options = { "port" : 8000 } #配置 settings = { "static_path" : os.path.join(BASE_DIRS, "static" ), "template_path" : os.path.join(BASE_DIRS, "templates" ), "debug" : True } 路由 ( r'/' , index.IndexHandler) ( r'/sunck' , index.SunckHandler, { "word1" : "good" , "word2" : "nice" }) class SunckHandler(RequestHandler): # 该方法会在HTTP方法之前调用 def initialize( self , word1, word2): self .word1 = word1 self .word2 = word2 def get( self , *args, **kwargs): print ( self .word1, self .word2) self .write( "sunck is a nice man" ) 注意 需要重写initialize方法接收传递的参数 tornado.web.url( r'/kaige' , index.KaigeHandler, { "word3" : "handsome" , "word4" : "cool" }, name = " index " ):反向解析使用此代替上面的路由映射 注意 如果使用name属性,不能使用元组路由,需要使用tornado.web.url定义路由 class KaigeHandler(RequestHandler): def initialize( self , word3, word4): self .word3 = word3 self .word4 = word4 def get( self , *args, **kwargs): print ( self .word3, self .word4) self .write( "kaige is a nice man" ) 反向解析 url = self .reverse_url( "kaigegood" ) self .write( "<a href='%s'>去另一个界面</a>" %(url)) self.reverse_url( " index " ) 会获取到name为"kaigegood"的路由的正则匹配 tornado.web.RequestHandler 利用HTTP协议向服务器传递参数 提取uri的特定部分 http://127.0.0.1:8000/liuyifei/good/nice/handsom ( r'/liuyifei/(\w+)/(\w+)/(\w+)' , index.LiuyifeiHandler) class LiuyifeiHandler(RequestHandler): def get( self , h1, h2, h3, *args, **kwargs): print (h1 + "-" + h2 + "-" + h3) self .write( "liuyifei is a nice women" ) ( r'/liuyifei/(?P<p1>\w+)/(?P<p3>\w+)/(?P<p2>\w+)' , index.LiuyifeiHandler) class LiuyifeiHandler(RequestHandler): def get( self , p1, p2, p3, *args, **kwargs): print (p1 + "-" + p2 + "-" + p3) self .write( "liuyifei is a nice women" ) get方式传递参数 127.0.0.1:8000/zhangmanyu?a=1&b=2&c=3 self.get_query_argument(name, default =ARG_DEFAULT, strip = True ) 参数 name 从get请求参数字符串中返回指定参数的值 如果出现过个同名参数,返回最后一个值 default 设置未传的name参数时返回默认的值,如果default也没有设置,会抛出 tornado.web.MissingArgumentError异常 strip 表示是否过滤掉左右两边的空白字符,默认为True过滤 示例 class ZhangmanyuHandler(RequestHandler): def get( self , *args, **kwargs): a = self .get_query_argument( "a" ) b = self .get_query_argument( "b" ) c = self .get_query_argument( "c" , strip = False ) print (a, b, "*" +c+ "*" ) self .write( "zhangmanyu is a good women" ) 127.0.0.1:8000/zhangmanyu?a=1&a=2 self.get_query_arguments(name, strip = True ) 参数 示例 class ZhangmanyuHandler(RequestHandler): def get( self , *args, **kwargs): alist = self .get_query_arguments( "a" ) print (alist[ 0 ], alist[ 1 ]) self .write( "zhangmanyu is a good women" ) post方式传递参数 self.get_body_argument(name,default=ARG_DEFAULT,s trip= True ) self.get_body_arguments(name,strip= True ) 示例 class PostFileHandler(RequestHandler): def get( self , *args, **kwargs): self .render( 'postfile.html' ) def post( self , *args, **kwargs): name = self .get_body_argument( "username" ) passwd = self .get_body_argument( "passwd" ) hobbyList = self .get_body_arguments( "hobby" ) print (name, passwd, hobbyList) self .write( "sunck is a handsome man" ) <!DOCTYPE html > < html lang= "en" > < head > < meta charset= "UTF-8" > < title >Title</ title > </ head > < body > < form action= "/postfile" method= "post" > 姓名:< input type= "text" name= "username" /> < hr /> 密码:< input type= "password" name= "passwd" /> < hr /> 爱好: < input type= "checkbox" value= "power" name= "hobby" >权利 < input type= "checkbox" value= "money" name= "hobby" >金钱 < input type= "checkbox" value= "book" name= "hobby" >书 < input type= "submit" value= "登陆" /> </ form > </ body > </ html > 即可以获取get请求,也可以获取post请求 self.get_argument(name,default=ARG_DEFAULT,strip= True ) self.get_argument(name,strip= True ) 注意 一不会选用般 在http报文的头中增加自定义的字段 request对象 作用 存储了关于请求的相关信息 属性 method HTTP请求的方式 host 被请求的主机名 uri 请求的完整资源地址,包括路径和get查询参数部分 path 请求的路径部分 query 请求参数部分 version 使用的HTTP版本 headers 请求的协议头,是一个字典类型 body 请求体数据 remote_ip 客户端的ip files 用户上传的文件,字典类型 { 'file': [ { 'filename': 'a.txt', 'body': b'sunck is a good man', 'content_type': 'text/plain' } ] } { 'file': [ { 'filename': 'a.txt', 'body': b'sunck is a good man', 'content_type': 'text/plain' }, { 'filename': 'b.txt', 'body': b'sunck is a nice man', 'content_type': 'text/plain' } ] } { 'file': [ { 'filename': 'a.txt', 'body': b'sunck is a good man', 'content_type': 'text/plain' }, { 'filename': 'b.txt', 'body': b'sunck is a nice man', 'content_type': 'text/plain' } ], 'img': [ { 'filename': 'tornado高效原理图.png', 'body': b'qwertyuiosdghj', 'content_type': 'image/png' } ] } 示例 class ZhuyinHandler(RequestHandler): def get( self , *args, **kwargs): print ( self .request.method) print ( self .request.host) print ( self .request.uri) print ( self .request.path) print ( self .request.query) print ( self .request.version) print ( self .request.headers) print ( self .request.body) print ( self .request.remote_ip) print ( self .request.files) self .write( "zhuyin is a good women" ) tornador.httputil.HTTPFile对象 作用 是接收到的文件对象 属性 filename 文件的实际名字 body 文件的数据实体 content_type 文件的类型 示例 import os import config class UpFileHandler(RequestHandler): def get( self , *args, **kwargs): self .render( 'upfile.html' ) def post( self , *args, **kwargs): filesDict = self .request.files for inputname in filesDict: fileArr = filesDict[inputname] for fileObj in fileArr: # 存储路径 filePath = os.path.join(config.BASE_DIRS, 'upfile/' + fileObj.filename) with open (filePath, "wb" ) as f: f.write(fileObj.body) self .write( "ok" ) 响应输出 write 原型 self.write(chunk) 作用 将chunk数据写到输出缓冲区 基础 class WriteHandler(RequestHandler): def get( self , *args, **kwargs): self .write( "sunck is a good man" ) self .write( "sunck is a nice man" ) self .write( "sunck is a handsome man" ) #刷新缓冲区,关闭当次请求通道 #在finish下边就不要在write self .finish() self .write( "sunck is a cool man" ) 利用write方法写json数据 import json class Json1Handler(RequestHandler): def get( self , *args, **kwargs): per = { "name" : "sunck" , "age" : 18 , "height" : 175 , "weight" : 70 } #将字典转换成json字符串 jsonStr = json.dumps(per) self .write(jsonStr) 手动将字典转成json字符串 class Json2Handler(RequestHandler): def get( self , *args, **kwargs): per = { "name" : "kaige" , "age" : 18 , "height" : 175 , "weight" : 70 } self .write(per) wirte直接返回字典 注意 自己手动序列化Json方式Content-Type属性值为text/html,而采用write自动序列化方式, Content-Type属性为application/json self.set_header(name, value) 作用 手动设置一个名为name,值为value的响应头字段 参数 name 字段名称 value 字段值 示例 import json class Json1Handler(RequestHandler): def get( self , *args, **kwargs): per = { "name" : "sunck" , "age" : 18 , "height" : 175 , "weight" : 70 } #将字典转换成json字符串 jsonStr = json.dumps(per) self .set_header( "Content-Type" , "application/json; charset=UTF-8" ) self .set_header( "sunck" , "good" ) self .write(jsonStr) set_default_headers() 作用 在进入HTTP响应处理方法之前被调用,可以重写该方法来预先设置默认的headers 注意 在HTTP处理方法中使用set_header设置的字段会覆盖set_default_headers()里设置的默认字段的 示例 class HeaderHandler(RequestHandler): def set_default_headers( self ): self .set_header( "Content-Type" , "text/html; charset=UTF-8" ) self .set_header( "kaige" , "nice" ) def get( self , *args, **kwargs): self .set_header( "kaige" , "handsome" ) self .write( "good nice" ) def post( self , *args, **kwargs): pass self.set_status(status_code, reason=None) 作用 为响应设置状态码 参数 status_code 状态码值,为int类型。 如果reason的值为None,则状态码必须为正常值 reason 描述状态码的词组,string类型 子主题 class StatusCodeHandler(RequestHandler): def get( self , *args, **kwargs): self .set_status( 404 ) self .write( "********************* ***" ) class StatusCodeHandler(RequestHandler): def get( self , *args, **kwargs): self .set_status( 999 , "who?where? what?" ) self .write( "************************" ) class StatusCodeHandler(RequestHandler): def get( self , *args, **kwargs): self .write( "********************** **" ) self .set_status( 999 ) 报错 重定向 self.redirect(url) 作用 重定向到url网址 示例 class RedirectHandler(RequestHandler): def get( self , *args, **kwargs): self .redirect( "/" ) self.send_error(status_code=500,**kwargs) 作用 抛出HTTP错误状态码,默认为500,抛出错误后tornado会调用wirte_error()方法进行处理,并 返回给浏览器错误界面 注意 在send_error之下就不要在响应输出了 wirte_error(status_code, **kwargs) 作用 用来处理send_error抛出的错误信息,并返回给浏览器错误界面 示例 #错误处理 class ErrorHandler(RequestHandler): def write_error( self , status_code, **kwargs): if status_code == 500 : code = 500 #返回500界面 self .write( "服务器内部错误" ) elif status_code == 404 : code = 404 #返回404界面 self .write( "资源不存在" ) self .set_status(code) def get( self , *args, **kwargs): flag = self .get_query_argument( "flag" ) print ( type (flag)) if flag == '0' : self .send_error( 404 ) self .write( "you are right" ) 完整项目构架